<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        var s1 = "some text";
        var s2 = s1.substring(2);
        console.log(s2); //me text
        //【1】流程分析
        //14行的代码，基本类型String理论上应该是没有方法的，尽管它们确实有，执行此布有以下过程
        // (1) 创建 String 类型的一个实例；(2) 在实例上调用指定的方法；(3) 销毁这个实例
        var s1 = new String("some text");
        var s2 = s1.substring(2);
        s1 = null;
        //以上过程是执行瞬间的创建和销毁过程，所以我们不能手动添加方法和属性
        var s1 = "some text";
        s1.color = "red";
        console.log(s1.color); //undefined
        //但是我们确实可以自己手动调用new，去显示调用包装函数
        //【2】Object函数
        //Object 构造函数也会像工厂方法一样，根据传入值的类型返回相应基本包装类型的
        var obj = new Object("some text");
        alert(obj instanceof String); //true
        //【2-1】要注意的是，使用 new 调用基本包装类型的构造函数，与直接调用同名的转型函数是不一样的。
        var value = "25";
        var number = Number(value); //转型函数返回对应基本类型的值
        alert(typeof number); //"number" 
        var obj = new Number(value); //构造函数，而new构造返回的是包装函数的实例对象
        alert(typeof obj); //"object"
    </script>
</body>

</html>